package realdance.swing.outline;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
/* 스윙 swing 개요
 * desktop UI를 개발할 때 사용하는 2가지 기술
 * AWT(abstract windows toolkit),Swing
 * AWT : Java 1.0부터 존재, 현재 Swing 으로 대체중
 * Swing : AWT의 제약을 극복하기 위해 발표
 * 		   Java 1.2부터 도입됨
 * 		     대표적인 기능은 look and feel 임
 * 그럼에도 불구하고, Java2D,Java3D를 이용해서
 * 풍부한 그래픽 환경을 제공하려면 AWT가 필요
 * 
 * AWT versus Swing
 * 이 둘간의 차이점은 컴퍼넌트를 그리는 방법에 있음
 * AWT는 운영체제의 라이브러리를 이용
 * 따라서, AWT로 작성된 프로그램은 윈도우와
 * 리눅스에서 다르게 보임
 * 하지만, Swing 은 운영체제에 종속되지 않은
 * 독립된 라이브러리를 이용
 * 따라서, Swing 을 이용한 프로그램은
 * 윈도우나 리눅스에서든 똑같은 모습으로 보임
 * 
 * 
 * 
 * 효과적인 UI 개발자가 되려면?
 * UI 컴퍼넌트 : JFrame, JDialog, JPanel 등의
 * 			    최상위 컨테이너와 여기에 추가할 수 있는 
 * 			   각종 컴퍼넌트 
 * 배치 관리자 layout manager : 컨테이너에
 * 			컴퍼넌트에 배치하는 방법
 * 이벤트 처리 : 버튼클릭, 마우스 이동, 크기조절 등의
 * 			 이벤트에 반응하는 코드 작성
 * 
 * 기본 스윙 컴퍼넌트
 * 스윙은 AWT를 대체하며, GUI 기반 프로그램 
 * 작성을 위한 자바 기술임
 * 하지만, 여전히 AWT 관련기술을 사용하고 있음
 * 스윙 컴퍼넌트는 javax.swing 패키지에 포함됨
 * 
 * java.awt.container < - JComponent,java.awt.window
 * 
 * JComponent <- Abstract Button, JcomboBox, JLabel, JmenuBar, JPanel
 * 
 * java.awt.Window <- java.awt.Frame, java.awt.Dialog
 * 
 * AbstractButton <- JButton, JmenuItem
 * 
 * java.awt.Frame <- JFrame
 * 
 * java.awtt.Dialog <- JDialog
 * 
 * JMenuItem <- JMenu
 * 
 * 위에서 보듯, AWT와 스윙의 명백한 차이점은
 * 스윙 컴퍼너트의 이름에는 J라는 접두사가 있음
 * 
 * 2개의 최상위 컨테이너(JFrame,JDialog)를
 * 제외하고 모든 스윙 컴퍼넌트는 반드시
 * 컨테이너에 포함되어야 함
 * 일반적으로 모든 스윙 프로그램의
 * 주 컨테이너는 JFrame 임(중요!)
 * 
 * JFrame
 * 최상위 컨테이너 중 하나 
 * 다른 컴퍼넌트들을 여기에 배치하려면
 * add 메서드를 호출
 * JFrame의 하위 컴퍼넌트인 JRootPane을
 * 가지고 있음 
 * 따라서, 컴퍼넌트를 추가하는 코드는
 * frame명.getContentPane().add(컴퍼넌트)임
 * 또한, JFrame 객체를 화면에 나타내기 위해
 * pack(), setVisible() 메서드를 사용함
 * pack() : 자식 컴퍼넌트에 따라 프레임 크기 조절
 * setVisible() : JFrame 표시 여부 지정
 * JFrame을 화면에서 지우려면 dispose() 메서드 호출
 * 
 * 한편, JFrame의 window 영역에는
 * title bar 와 content pane 등의 2개의 영역으로 구분
 * 컴퍼넌트들을 배치할 수 있는 content pane 은
 * JFrame 에 의해 생성되는 또 다른 객체임 
 * 일반적으로 JPanel 을 content pane 으로 사용함
 * 
 */
public class J01_HelloSwingFrame extends JFrame {
	
	private JPanel contentPane;
	// JFrame = 최소화,최대화,닫기 Dialog = 닫기버튼만 있는 창 생성
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		// JDK 6+ 에서 스윙 프로그램은
		// invokeLater 메서드를 이용해서
		// JFrame 을 호출하도록 작성하는 것을 추천!
		
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					J01_HelloSwingFrame frame = new J01_HelloSwingFrame();
					frame.setVisible(true);
					// 생성한 JFrame을 화면에 띄움
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public J01_HelloSwingFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 닫기 버튼을 눌렀을때 처리 할 내용
		// EXIT_ON_CLOSE : system.exit()호출 후 프로그램 종료
		// 위 기능 외의 것을 처리하려면
		// DO_NOTHING_ON_CLOSE를 이용해야함 -- 메시지 팝업에 종료여부 출력
		setBounds(150, 150, 1024, 768);
		// pack() 메서드의 대체제
		// JFrame의 크기를 변경할 때 자주 사용
		// setBounds(x 위치,y 위치,너비,높이) -- x,y 는 창을 띄울 위치
		// setSize(너비,높이)
		// 주의 : setVisible이 호출되기 전에 먼저 호출!
		setResizable(false);
		// JFrame의 크기 조절 불가
		setTitle("Hello, Swing JFrame!!");
		// JFrame의 제목 지정
		
		// JFrame에 컴퍼넌트를 배치하기 위해
		// content pane 에 JPanel을 하나 생성해서
		// content pane 에 지정함	
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		// JPanel의 상하좌우 여백 padding 지정
		// 방향은 상우하좌(시계 방향) -- 5,5,5,5
		contentPane.setLayout(new BorderLayout(0, 0)); // 좌표 = 시작점
		// 컴퍼넌트 배치 방법을 지정
		// BorderLayout : 5개 영역으로 구분해 배치
		//                영역구성 : 동서남북, 중앙
		setContentPane(contentPane);
		// 위에서 생성한 panel 을
		// JFrame의 content pane 영역으로 지정
		
	}

}
